package gestores;

import java.sql.ResultSet;
import java.util.Date;
import java.util.Vector;

import entidades.Actividad;
import entidades.ActividadEnPotrero;
import entidades.Campo;
import entidades.Potrero;
import entidades.RegistroDeLLuvia;

public class GestorCampo {
	
	private Campo campoActual;
	private AdministradorBD adminBD= new AdministradorBD();
	private static GestorCampo gCampo;
	
   static public GestorCampo getGestorCampo() {

        if (gCampo == null) {
            gCampo = new GestorCampo();
        }
        return gCampo;
    }

	public Campo getCampoActual() {
		return campoActual;
	}
	
	public void setCampoActual(Campo campoActual) {
		this.campoActual = campoActual;
	}
	
	public Vector<Campo> getCamposEncontrados() throws Throwable {
		

		Vector<Campo> campos= new Vector<Campo>();
		ResultSet rs=adminBD.getCamposEncontrados();
		try {
			if(rs.next()){
				do{
					Campo c=new Campo(rs.getInt("idCampo"), rs.getString("nombreCampo"));
					Vector<Potrero> potreros=getPotrerosEncontrados(c);
					for(int i=0;i<potreros.size();i++){
						potreros.get(i).setActividades(getActividadesEnPotrero(potreros.get(i)));
					}
					c.setPotreros(potreros);
					c.setRegistrosDeLluvia(getRegistrosDeLLuvia(c));
					
					campos.add(c);
				}while(rs.next());
			}
		} catch (Throwable e) {
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		
		
		return campos;
	}
	private Vector<ActividadEnPotrero> getActividadesEnPotrero(Potrero potrero) throws Throwable  {

		Vector<ActividadEnPotrero> actividades= new Vector<ActividadEnPotrero>();
		try{
			ResultSet rs=adminBD.getActividadEnPotrero(potrero.getIdPotrero());
			if(rs.next()){
				do{
					Actividad a= new Actividad(rs.getInt("a.idActividad"), rs.getString("a.actividad"));
					ActividadEnPotrero ap= new ActividadEnPotrero(rs.getInt("idActividad_En_Potrero"),a, potrero, rs.getString("descripcion"), (Date) rs.getObject("fecha"));
					actividades.add(ap);
				}while(rs.next());
			}
		} catch (Throwable e) {
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		return actividades;
	}

	
	public Vector<Potrero> getPotrerosEncontrados(Campo c) throws Throwable {
		int idCampo=c.getIdCampo();

		Vector<Potrero> potreros= new Vector<Potrero>();
		ResultSet rs=adminBD.getPotrerosEncontrados(idCampo);
		try {
			if(rs.next()){
				do{
					Potrero p=new Potrero(rs.getInt("idPotrero"), rs.getString("nombrePotrero"));
					p.setCampoPerteneciente(c);
					potreros.add(p);
					
					
				}while(rs.next());
			}

		} catch (Throwable e) {
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		
		
		return potreros;
	}
	public void registrarCampo(String nombreCampo) throws Throwable {
		adminBD.registrarCampo(nombreCampo,GestorUsuario.getGestorUsuario().getUsuarioActual().getIdUsuario());
		
	}
	public void registrarPotrero(String potrero, int idCampo) throws Throwable {
		adminBD.registrarPotrero(potrero,idCampo);		
	}
	
	public int registrarLLuvia(int milimetros,Date fecha,String observacion,int idCampo) throws Throwable {
		return adminBD.registrarLLuvia(milimetros, fecha, observacion, idCampo);
		
	}

	private Vector<RegistroDeLLuvia> getRegistrosDeLLuvia(Campo campo) throws Throwable  {
		int idCampo=campo.getIdCampo();
		Vector<RegistroDeLLuvia> registros= new Vector<RegistroDeLLuvia>();
		try{
			ResultSet rs=adminBD.getRegistrosDeLLuvia(idCampo);
			if(rs.next()){
				do{
					RegistroDeLLuvia r= new RegistroDeLLuvia(rs.getInt("idRegistro_LLuvia"), rs.getInt("milimetros"), (Date) rs.getObject("fecha"), campo, rs.getString("observacion"));
					registros.add(r);
				}while(rs.next());
			}
		} catch (Throwable e) {
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		return registros;
	}

	public int registrarActividadEnPotrero(int idActividad,int idPotrero, Date fecha, String observacion) throws Throwable {
		return adminBD.registrarActividadEnPotrero(idActividad, idPotrero, fecha, observacion);
		
	}
	
	public Campo getCampoCompleto(Campo campo) throws Throwable  {

		campo.setRegistrosDeLluvia(getRegistrosDeLLuvia(campo));
		for(int i=0;i<campo.getPotreros().size();i++){
			campo.getPotreros().get(i).setActividades(getActividadesEnPotrero(campo.getPotreros().get(i)));
		}
		return campo;
	}

	public void setCaracteristicas(int idCampo, String text) throws Throwable {
		adminBD.setCaracteristicas(idCampo,text);
	}


   
   


}
